<!DOCTYPE html>
<html lang="" xml:lang="">
  <head>
    <title>使用 BP 程序进行特定的光合测量的演示</title>
    <meta charset="utf-8" />
    <meta name="author" content="祝介东" />
    <link rel="stylesheet" href="zh-CN.css" type="text/css" />
    <link rel="stylesheet" href="extra-rutgers.css" type="text/css" />
    <link rel="stylesheet" href="animate-min.css" type="text/css" />
  </head>
  <body>
    <textarea id="source">
class: center, middle, inverse, title-slide

# 使用 BP 程序进行特定的光合测量的演示
## 改变环境控制和测量时间的测量
### 祝介东
### 北京力高泰科技有限公司 技术部
### 2020-04-28 修改

---

background-image: url(https://s2.ax1x.com/2020/03/09/8S2l7T.png)

background-size: cover

class: center, middle, animated, fadeIn

# .large[改变环境和测量时间的测量]

---
class: animated, fadeIn
# 改变环境控制和记录时间的测量

在实际的测量中，我们有时候会改变环境条件，然后进行一段时间的测量，记录数据，若不使用 BP，那么只能手动控制，缺点是手动参数的更改需要时间更长，反复更改容易出错。**而使用 BP，只需要一次设置，确保不出错后则按照我们既定的顺序来执行所有的操作。**我们以下面的程序来演示该类型测量的 BP 的设定方法：

### 1. 设置 `\(CO_2R\)` 的值为 0，记录 2 min，记录间隔  1 min。

### 2. 设置 `\(CO_2R\)` 的值为 400，记录 1 min，记录间隔  30 s。

### 3. 设置 `\(CO_2R\)` 的值为 0，记录 1 min，记录间隔  30 s。

.footnote.red[以上时间的设置仅为演示所需，可根据需要任意更改]
---
class: animated, fadeIn
# 方法 1

### 1. 设置 `\(CO_2R\)` 浓度
### 2. 根据需要是否设置等待浓度稳定的时间
### 3. 利用 LOOP 循的环持续时间功能来设置记录的时间和间隔

### 最后将上述步骤重复 n 次，来完成控制。

---

class: animated, fadeIn
# 方法 2

### 1. 设置 `\(CO_2R\)` 浓度
### 2. 根据需要是否设置等待浓度稳定的时间
### 3. 调用 DEFINEs 的 autolog 来自动记录一定时间的数据

### 最后将上述步骤重复 n 次，来完成控制。

### 注：同方法1没有本质的区别，但胜在减少了编辑的时间或者可以控制某一步不进行。
---
class: animated, fadeIn
# 方法 1 的关键 STEPs：
 ```python
PROPERTIES(verbose="True",pause="False"),
LOG(open="\"/home/licor/logs/zjd/test\"",app=False),
SETCONTROL("CO2_r","0","float"),
LOOP(dur="1",
	units="Minutes",
	steps=()
		WAIT(dur="10",units="Seconds"),
		LOG(),
	)
),
LOG(close=0),
 ```
 
&lt;br /&gt;
该方法一是一种最原始的方法，也就是重复第一次环境控制的程序，也就是复制第一次的 steps，只是将相应的的设置更改后设置更多的条件的测量。但这样的缺点是反复设置 LOOPs，要处理好缩进，在程序设置的时候可能因为缩进等问题，需要花更多的时间调试。那有没有一种出错少，时间少的方法呢？
---
class: animated, fadeIn
# STEPs 的解释
- 在日志显示信息
  ```python
  PROPERTIES(verbose="True",pause="False")
  ```

- 在 logs 文件夹下的 zjd 文件夹打开一个 test 文件，不追加
  ```python
LOG(open="\"/home/licor/logs/zjd/test\"",app=False)
  ```
  
- 控制二氧化碳浓度
  ```python
SETCONTROL("CO2_r","0","float")
  ```

---
class: animated, fadeIn
# 方法 1 的关键 STEP：


- 开始一个循环，时间持续 1 min 中，每 10 s 记录一个数据
  ```python
LOOP(
dur="1", units="Minutes", steps=() WAIT(dur="10",units="Seconds"),LOG(),
)
 ```
-  LOG 有关闭数据文件的功能
  
  - 尽管 BLUE &gt; 1.3.17 后 LI-6800 支持关机前关闭记录数据文件，但是在程序的最后自动关闭数据文件是一个良好的习惯
    ```python
LOG(close=0)
    ```
---
class: animated, fadeIn
# 方法 2 STEPs 的解释
 
 ```python
PROPERTIES(verbose="True",pause="False"),
LOG(open="\"/home/licor/logs/zjd/test\"",app=False),
SETCONTROL("CO2_r","0","float"),
CALL("AutoLog",
	['1', '10']),
SETCONTROL("CO2_r","300","float"),
CALL("AutoLog",
	['2', '30']),
SETCONTROL("CO2_r","300","float"),
CALL("AutoLog",
	['', '10']),
LOG(close=0),
 ```

- 该方法直接利用 DEFINEs 库的 AutoLog 来记录数据，避免了手动插入 LOOP。

- 在 DEFINEs 库中的文件可以直接调用，无需放在一个 py 文件内。

- 调用的方法是 CALL 语句。
---
class: animated, fadeIn, center, middle, inverse

# .large[示例 1 的演示]

---
class: inverse, center, middle, animated, fadeIn

# .large[谢谢！]

![](./img/gif-qrcode.gif)&lt;!-- --&gt;
## 关注公众号后获取更多精彩内容
    </textarea>
<style data-target="print-only">@media screen {.remark-slide-container{display:block;}.remark-slide-scaler{box-shadow:none;}}</style>
<script src="https://remarkjs.com/downloads/remark-latest.min.js"></script>
<script>var slideshow = remark.create({
"ratio": "16:9",
"highlightStyle": "ir-black",
"highlightLines": true,
"countIncrementalSlides": false
});
if (window.HTMLWidgets) slideshow.on('afterShowSlide', function (slide) {
  window.dispatchEvent(new Event('resize'));
});
(function(d) {
  var s = d.createElement("style"), r = d.querySelector(".remark-slide-scaler");
  if (!r) return;
  s.type = "text/css"; s.innerHTML = "@page {size: " + r.style.width + " " + r.style.height +"; }";
  d.head.appendChild(s);
})(document);

(function(d) {
  var el = d.getElementsByClassName("remark-slides-area");
  if (!el) return;
  var slide, slides = slideshow.getSlides(), els = el[0].children;
  for (var i = 1; i < slides.length; i++) {
    slide = slides[i];
    if (slide.properties.continued === "true" || slide.properties.count === "false") {
      els[i - 1].className += ' has-continuation';
    }
  }
  var s = d.createElement("style");
  s.type = "text/css"; s.innerHTML = "@media print { .has-continuation { display: none; } }";
  d.head.appendChild(s);
})(document);
// delete the temporary CSS (for displaying all slides initially) when the user
// starts to view slides
(function() {
  var deleted = false;
  slideshow.on('beforeShowSlide', function(slide) {
    if (deleted) return;
    var sheets = document.styleSheets, node;
    for (var i = 0; i < sheets.length; i++) {
      node = sheets[i].ownerNode;
      if (node.dataset["target"] !== "print-only") continue;
      node.parentNode.removeChild(node);
    }
    deleted = true;
  });
})();
(function() {
  "use strict"
  // Replace <script> tags in slides area to make them executable
  var scripts = document.querySelectorAll(
    '.remark-slides-area .remark-slide-container script'
  );
  if (!scripts.length) return;
  for (var i = 0; i < scripts.length; i++) {
    var s = document.createElement('script');
    var code = document.createTextNode(scripts[i].textContent);
    s.appendChild(code);
    var scriptAttrs = scripts[i].attributes;
    for (var j = 0; j < scriptAttrs.length; j++) {
      s.setAttribute(scriptAttrs[j].name, scriptAttrs[j].value);
    }
    scripts[i].parentElement.replaceChild(s, scripts[i]);
  }
})();
(function() {
  var links = document.getElementsByTagName('a');
  for (var i = 0; i < links.length; i++) {
    if (/^(https?:)?\/\//.test(links[i].getAttribute('href'))) {
      links[i].target = '_blank';
    }
  }
})();
// adds .remark-code-has-line-highlighted class to <pre> parent elements
// of code chunks containing highlighted lines with class .remark-code-line-highlighted
(function(d) {
  const hlines = d.querySelectorAll('.remark-code-line-highlighted');
  const preParents = [];
  const findPreParent = function(line, p = 0) {
    if (p > 1) return null; // traverse up no further than grandparent
    const el = line.parentElement;
    return el.tagName === "PRE" ? el : findPreParent(el, ++p);
  };

  for (let line of hlines) {
    let pre = findPreParent(line);
    if (pre && !preParents.includes(pre)) preParents.push(pre);
  }
  preParents.forEach(p => p.classList.add("remark-code-has-line-highlighted"));
})(document);</script>

<script>
slideshow._releaseMath = function(el) {
  var i, text, code, codes = el.getElementsByTagName('code');
  for (i = 0; i < codes.length;) {
    code = codes[i];
    if (code.parentNode.tagName !== 'PRE' && code.childElementCount === 0) {
      text = code.textContent;
      if (/^\\\((.|\s)+\\\)$/.test(text) || /^\\\[(.|\s)+\\\]$/.test(text) ||
          /^\$\$(.|\s)+\$\$$/.test(text) ||
          /^\\begin\{([^}]+)\}(.|\s)+\\end\{[^}]+\}$/.test(text)) {
        code.outerHTML = code.innerHTML;  // remove <code></code>
        continue;
      }
    }
    i++;
  }
};
slideshow._releaseMath(document);
</script>
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src  = 'https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-MML-AM_CHTML';
  if (location.protocol !== 'file:' && /^https?:/.test(script.src))
    script.src  = script.src.replace(/^https?:/, '');
  document.getElementsByTagName('head')[0].appendChild(script);
})();
</script>
  </body>
</html>
